package mx.itesm.papamastodon.dienosaurs;

import org.andengine.engine.Engine;

/**
 * Administra la escena que se verá en la pantalla
 */
public class AdministradorEscenas {
    // Instancia única
    private static final AdministradorEscenas INSTANCE =
            new AdministradorEscenas();

    // Declara las distintas escenas que forman el juego
    private EscenaBase escenaSplash;
    private EscenaBase escenaMenu;
    private EscenaBase escenaAcercaDe;
    private EscenaBase escenaJuego;
    private EscenaBase escenaPuntaje;
    private EscenaBase escenaGameOver;
    private EscenaBase escenaGameOver2;
    private EscenaBase escenaGameOver3;
    private EscenaBase escenaAjustes;
    private EscenaBase escenaInstrucciones;
    private EscenaBase escenaInstrucciones2;
    private EscenaBase escenaNiveles;
    private EscenaBase escenaJuego2;
    private EscenaBase escenaInstrucciones3;
    private EscenaBase escenaJuego3;


    // El tipo de escena que se está mostrando
    private TipoEscena tipoEscenaActual = TipoEscena.ESCENA_SPLASH;
    // La escena que se está mostrando
    private EscenaBase escenaActual;
    // El engine para hacer el cambio de escenas
    private Engine engine = AdministradorRecursos.getInstance().engine;
    // El administrados de recursos
    private AdministradorRecursos admRecursos = AdministradorRecursos.getInstance();

    // Regresa la instancia del administrador de escenas
    public static AdministradorEscenas getInstance() {
        return INSTANCE;
    }

    // Regresa el tipo de la escena actual
    public TipoEscena getTipoEscenaActual() {
        return tipoEscenaActual;
    }

    // Regresa la escena actual
    public EscenaBase getEscenaActual() {
        return escenaActual;
    }

    /*
     * Pone en la pantalla la escena que llega como parámetro y guarda el nuevo estado
     */
    private void setEscenaBase(EscenaBase nueva) {
        engine.setScene(nueva);
        escenaActual = nueva;
        tipoEscenaActual = nueva.getTipoEscena();
    }

    /**
     * Cambia a la escena especificada en el parámetro
     *
     * @param nuevoTipo la nueva escena que se quiere mostrar
     */
    public void setEscena(TipoEscena nuevoTipo) {
        switch (nuevoTipo) {
            case ESCENA_SPLASH:
                setEscenaBase(escenaSplash);
                break;
            case ESCENA_MENU:
                setEscenaBase(escenaMenu);
                break;
            case ESCENA_ACERCA_DE:
                setEscenaBase(escenaAcercaDe);
                break;
            case ESCENA_PUNTAJE:
                setEscenaBase(escenaPuntaje);
                break;
            case ESCENA_JUEGO:
                setEscenaBase(escenaJuego);
                break;
            case ESCENA_GAME_OVER:
                setEscenaBase(escenaGameOver);
                break;
            case ESCENA_AJUSTES:
                setEscenaBase(escenaAjustes);
                break;
            case ESCENA_INSTRUCCIONES:
                setEscenaBase(escenaInstrucciones);
                break;
            case ESCENA_INSTRUCCIONES2:
                setEscenaBase(escenaInstrucciones2);
                break;
            case ESCENA_NIVELES:
                setEscenaBase(escenaNiveles);
                break;
            case ESCENA_JUEGO2:
                setEscenaBase(escenaJuego2);
                break;
            case ESCENA_INSTRUCCIONES3:
                setEscenaBase(escenaInstrucciones3);
                break;
            case ESCENA_JUEGO3:
                setEscenaBase(escenaJuego3);
                break;
            case ESCENA_GAME_OVER2:
                setEscenaBase(escenaGameOver2);
                break;
            case ESCENA_GAME_OVER3:
                setEscenaBase(escenaGameOver3);

        }
    }

    //*** Crea la escena de Splash
    public void crearEscenaSplash() {
        // Carga los recursos
        admRecursos.cargarRecursosSplash();
        escenaSplash = new EscenaSplash();
    }

    //*** Libera la escena de Splash
    public void liberarEscenaSplash() {
        admRecursos.liberarRecursosSplash();
        escenaSplash.liberarEscena();
        escenaSplash = null;
    }

    public void crearEscenaNiveles(){
        admRecursos.cargarRecursosNiveles();
        escenaNiveles=new EscenaNiveles();
    }

    public void liberarEscenaNiveles(){
        admRecursos.liberarRecursosNiveles();
        escenaNiveles.liberarEscena();
        escenaNiveles=null;
    }

    public void crearEscenaInstrucciones2() {
        admRecursos.cargarRecursosInstrucciones2();
        escenaInstrucciones2 = new EscenaInstrucciones2();
    }

    public void liberarEscenaInstrucciones2() {
        admRecursos.liberarRecursosInstrucciones2();
        escenaInstrucciones2 = null;
    }

    public void crearEscenaInstrucciones() {
        admRecursos.cargarRecursosInstrucciones();
        escenaInstrucciones = new EscenaInstrucciones();
    }

    public void liberarEscenaInstrucciones() {
        admRecursos.liberarRecursosInstrucciones();
        escenaInstrucciones = null;
    }

    // ** MENU
    //*** Crea la escena de MENU
    public void crearEscenaMenu() {
        // Carga los recursos
        admRecursos.cargarRecursosMenu();
        escenaMenu = new EscenaMenu();
    }

    //*** Libera la escena de MENU
    public void liberarEscenaMenu() {
        admRecursos.liberarRecursosMenu();
        escenaMenu.liberarEscena();
        escenaMenu = null;
    }

    //*** Crea la escena de Acerca De
    public void crearEscenaAcercaDe() {
        // Carga los recursos
        admRecursos.cargarRecursosAcercaDe();
        escenaAcercaDe = new EscenaAcercaDe();
    }

    //*** Libera la escena de Splash
    public void liberarEscenaAcercaDe() {
        admRecursos.liberarRecursosAcercaDe();
        escenaAcercaDe.liberarEscena();
        escenaAcercaDe = null;
    }

    public void crearEscenaPuntaje() {
        admRecursos.cargarRecursosPuntaje();
        escenaPuntaje = new EscenaPuntaje();
    }

    public void liberarEscenaPuntaje() {
        admRecursos.liberarRecursosPuntaje();
        escenaPuntaje.liberarEscena();
        escenaPuntaje = null;
    }

    public void crearEscenaJuego() {
        admRecursos.cargarRecursosJuego();
        escenaJuego = new EscenaJuego();
    }

    public void liberarEscenaJuego() {
        admRecursos.liberarRecursosJuego();
        escenaJuego.liberarEscena();
        escenaJuego = null;
    }

    public void crearEscenaGameOver() {
        admRecursos.cargarRecursosGameOver();
        escenaGameOver = new EscenaGameOver();
    }

    public void liberarEscenaGameOver() {
        admRecursos.liberarRecursosGameOver();
        escenaGameOver.liberarEscena();
        escenaGameOver = null;
    }

    public void crearEscenaGameOver2() {
        admRecursos.cargarRecursosGameOver2();
        escenaGameOver2 = new EscenaGameOver2();
    }

    public void liberarEscenaGameOver2() {
        admRecursos.liberarRecursosGameOver2();
        escenaGameOver2.liberarEscena();
        escenaGameOver2 = null;
    }

    public void crearEscenaGameOver3() {
        admRecursos.cargarRecursosGameOver3();
        escenaGameOver3 = new EscenaGameOver3();
    }

    public void liberarEscenaGameOver3() {
        admRecursos.liberarRecursosGameOver3();
        escenaGameOver3.liberarEscena();
        escenaGameOver3 = null;
    }

    public void crearEscenaAjustes() {
        admRecursos.cargarRecursosAjustes();
        escenaAjustes = new EscenaAjustes();

    }

    public void liberarEscenaAjustes() {
        admRecursos.liberarRecursosAjustes();
        escenaAjustes.liberarEscena();
        escenaAjustes = null;
    }

    public void crearEscenaJuego2() {
        admRecursos.cargarRecursosJuego2();
        escenaJuego2 = new EscenaJuego2();

    }

    public void liberarEscenaJuego2() {
        admRecursos.liberarRecursosJuego2();
        escenaJuego2.liberarEscena();
        escenaJuego2 = null;
    }

    public void crearEscenaInstrucciones3() {
        admRecursos.cargarRecursosInstrucciones3();
        escenaInstrucciones3 = new EscenaInstrucciones3();
    }

    public void liberarEscenaInstrucciones3() {
        admRecursos.liberarRecursosInstrucciones3();
        escenaInstrucciones3 = null;
    }

    public void crearEscenaJuego3() {
        admRecursos.cargarRecursosJuego3();
        escenaJuego3 = new EscenaJuego3();

    }

    public void liberarEscenaJuego3() {
        admRecursos.liberarRecursosJuego3();
        escenaJuego3.liberarEscena();
        escenaJuego3 = null;
    }


}